{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Numpy实现多项式曲线拟合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题定义：  \n",
    "对于一堆数据点(x, y)，能否只根据这些数据，找出一个函数，使得函数画出来的曲线和原始数据曲线尽量匹配？\n",
    "\n",
    "多项式拟合问题：   \n",
    "任何可微连续的函数，都可以用一个N次多项式来估计，而比N次幂更高阶的部分为无穷小可以忽略不计\n",
    "\n",
    "3次多项式即：a$x^3$ + b$x^2$ + cx + d  \n",
    "比如我们可以让sin(x) 约等于 a$x^3$ + b$x^2$ + cx + d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 构造原始数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x是一个数组，在-5~5，等间距生成的50个点\n",
    "x = np.linspace(-5, 5, 50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 假造y，为sin(x)，同时加上一些噪声，模拟真实世界的数据\n",
    "y = np.sin(x) + np.random.rand(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((50,), (50,))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x1b9a973a548>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 使用Numpy拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用三次方多项式做拟合\n",
    "params = np.polyfit(x, y, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.03081096,  0.00494345,  0.43634886,  0.47804581])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "poly1d([-0.03081096,  0.00494345,  0.43634886,  0.47804581])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造一个便捷多项式对象\n",
    "param_func = np.poly1d(params)\n",
    "param_func"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 根据原始的x，计算拟合的y_predict\n",
    "y_predict = param_func(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1b9aa5b2f48>]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.plot(x, y_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
